#!/bin/bash
# -*- coding: utf-8 -*-
"""
@file stop_services.sh
@brief 停止服务脚本
@details 停止所有正在运行的电机控制器服务
@author zhang33
@date 2025-09-05
"""

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

echo "=========================================="
echo "无刷电机驱动器控制器 - 停止服务脚本"
echo "作者: zhang33"
echo "日期: 2025-09-05"
echo "=========================================="
echo ""

# 停止API服务器
stop_api_server() {
    log_info "停止API服务器..."
    
    # 查找API服务器进程
    API_PIDS=$(ps aux | grep "start.py" | grep -v grep | awk '{print $2}')
    
    if [ -z "$API_PIDS" ]; then
        log_warning "未找到运行中的API服务器"
    else
        for pid in $API_PIDS; do
            log_info "停止API服务器进程: $pid"
            kill $pid
            if [ $? -eq 0 ]; then
                log_success "API服务器进程 $pid 已停止"
            else
                log_error "停止API服务器进程 $pid 失败"
            fi
        done
    fi
}

# 停止GUI程序
stop_gui() {
    log_info "停止GUI程序..."
    
    # 查找GUI进程
    GUI_PIDS=$(ps aux | grep "start.py gui\|run_gui.py" | grep -v grep | awk '{print $2}')
    
    if [ -z "$GUI_PIDS" ]; then
        log_warning "未找到运行中的GUI程序"
    else
        for pid in $GUI_PIDS; do
            log_info "停止GUI进程: $pid"
            kill $pid
            if [ $? -eq 0 ]; then
                log_success "GUI进程 $pid 已停止"
            else
                log_error "停止GUI进程 $pid 失败"
            fi
        done
    fi
}

# 停止所有Python相关进程
stop_all_python() {
    log_info "停止所有Python相关进程..."
    
    # 查找所有相关的Python进程
    PYTHON_PIDS=$(ps aux | grep -E "(start\.py|run_gui\.py|run_api_server\.py|test_api\.py)" | grep -v grep | awk '{print $2}')
    
    if [ -z "$PYTHON_PIDS" ]; then
        log_warning "未找到运行中的Python进程"
    else
        for pid in $PYTHON_PIDS; do
            log_info "停止Python进程: $pid"
            kill $pid
            if [ $? -eq 0 ]; then
                log_success "Python进程 $pid 已停止"
            else
                log_error "停止Python进程 $pid 失败"
            fi
        done
    fi
}

# 强制停止（使用SIGKILL）
force_stop() {
    log_warning "强制停止所有相关进程..."
    
    # 强制停止API服务器
    pkill -9 -f "start.py api"
    if [ $? -eq 0 ]; then
        log_success "强制停止API服务器完成"
    fi
    
    # 强制停止GUI程序
    pkill -9 -f "start.py gui\|run_gui.py"
    if [ $? -eq 0 ]; then
        log_success "强制停止GUI程序完成"
    fi
    
    # 强制停止所有相关进程
    pkill -9 -f "run_api_server.py\|test_api.py"
    if [ $? -eq 0 ]; then
        log_success "强制停止其他进程完成"
    fi
}

# 检查端口占用
check_ports() {
    log_info "检查端口占用情况..."
    
    # 检查5000端口（API服务器）
    if netstat -tlnp 2>/dev/null | grep -q ":5000 "; then
        log_warning "端口5000仍被占用"
        netstat -tlnp 2>/dev/null | grep ":5000 "
    else
        log_success "端口5000已释放"
    fi
}

# 显示帮助信息
show_help() {
    echo "使用方法:"
    echo "  $0 [选项]"
    echo ""
    echo "选项:"
    echo "  -a, --api     只停止API服务器"
    echo "  -g, --gui     只停止GUI程序"
    echo "  -p, --python  停止所有Python相关进程"
    echo "  -f, --force   强制停止所有进程"
    echo "  -c, --check   检查端口占用情况"
    echo "  -h, --help    显示此帮助信息"
    echo ""
    echo "示例:"
    echo "  $0                # 停止所有服务"
    echo "  $0 --api          # 只停止API服务器"
    echo "  $0 --force        # 强制停止所有进程"
}

# 主函数
main() {
    case "${1:-}" in
        -a|--api)
            stop_api_server
            ;;
        -g|--gui)
            stop_gui
            ;;
        -p|--python)
            stop_all_python
            ;;
        -f|--force)
            force_stop
            ;;
        -c|--check)
            check_ports
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        "")
            # 默认：停止所有服务
            stop_api_server
            stop_gui
            stop_all_python
            check_ports
            ;;
        *)
            log_error "未知选项: $1"
            show_help
            exit 1
            ;;
    esac
    
    echo ""
    log_success "停止服务完成！"
}

# 运行主函数
main "$@"
